//
//  HMEmoticonManager.swift
//  表情键盘
//
//  Created by iOS on 16/9/28.
//  Copyright © 2016年 iOS. All rights reserved.
//

import UIKit

let bundlePath = Bundle.main.path(forResource: "Emoticons.bundle", ofType: nil)!

/// 加载表情模型
class HMEmoticonManager: NSObject {
    
    static let shared: HMEmoticonManager = HMEmoticonManager()
    
    // 所有表情包
    lazy var packages: [HMEmoticonPackageModel] = self.loadEmoticonPackages()
    
    let recentEmoticonPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! + "/recentEmoticon.plist"
    
    /// 加载所有表情包
    private func loadEmoticonPackages() -> [HMEmoticonPackageModel] {
        // 最近
        let recentEmoticons = loadRecentEmoticon()
        let recentPackage = HMEmoticonPackageModel(id: "", group_name_cn: "最近", emoticons: recentEmoticons)
        
        let defaultPackage = loadEmoticonPackage(id: "com.sina.default")
        let emojiPackage = loadEmoticonPackage(id: "com.apple.emoji")
        let lxhPackage = loadEmoticonPackage(id: "com.sina.lxh")
        
        return [recentPackage, defaultPackage, emojiPackage, lxhPackage]
    }
    
    /// 加载表情包模型
    ///
    /// - parameter id: 表情包文件夹名称
    ///
    /// - returns: 表情包模型
    private func loadEmoticonPackage(id: String) -> HMEmoticonPackageModel {
        // info.plist路径 = bundlePath + id + info.plist
        let infoPath = bundlePath + "/" + id + "/info.plist"
        let infoDict = NSDictionary(contentsOfFile: infoPath)!
//        print("infoDict: \(infoDict)")
        
        // 获取名称
        let group_name_cn = infoDict["group_name_cn"] as! String
        
        // 获取表情数组
        let array = infoDict["emoticons"] as! [[String: String]]
        
        // 表情模型数组
        var emoticons = [HMEmoticonModel]()
        
        for dict in array {
            // 将表情字典转成表情模型
            let model = HMEmoticonModel(id: id, dict: dict)
            emoticons.append(model)
        }
        
        return HMEmoticonPackageModel(id: id, group_name_cn: group_name_cn, emoticons: emoticons)
    }
    
    /// 将表情添加到最近这组里面
    func addRecentEmoticon(emoticon: HMEmoticonModel) -> Void {
        // 1.获取到最近这页的表情,swift中操作 emoticons 不会影响 packages[0].pageEmoticons[0] 原来的数组
        var emoticons = packages[0].pageEmoticons[0]
        
        // 1.1判断是否有重复的表情
        var repeatEmoticon: HMEmoticonModel?
        for e in emoticons {
            // 1.emoji 判断 code
            // 2.图片 判断 chs
            if (emoticon.code != nil && emoticon.code == e.code) || (emoticon.chs != nil && emoticon.chs == e.chs) {
                // 是相同的表情,不要再遍历数组的时候去删除数组中的内容
                // 注意: 赋值的时候数组中的元素.
                repeatEmoticon = e
                break
            }
        }
        
        // 1.2 有重复的表情就删除
        if let e = repeatEmoticon {
            // 先根据模型,获取到模型对应的位置
            let index = emoticons.index(of: e)!
            emoticons.remove(at: index)
        }
        
        // 2.将模型添加到最前
        emoticons.insert(emoticon, at: 0)
        
        // 2.1当表情超出20个时删除最后一个
        if emoticons.count > NumberOfCell {
            emoticons.removeLast()
        }
        
        // swift中操作 emoticons 不会影响 packages[0].pageEmoticons[0] 原来的数组
        // 3.重新赋值回去
        packages[0].pageEmoticons[0] = emoticons
//        print("emoticons: \(emoticons)")
//        print("packages[0].pageEmoticons[0]: \(packages[0].pageEmoticons[0])")
        
        // 保存最近的表情
        saveRecentEmoticon()
    }
    
    /// 保存最近的表情
    private func saveRecentEmoticon() {
//        print("recentEmoticonPath: \(recentEmoticonPath)")
        // 归档数组
        NSKeyedArchiver.archiveRootObject(packages[0].pageEmoticons[0], toFile: recentEmoticonPath)
    }
    
    /// 加载最近表情
    private func loadRecentEmoticon() -> [HMEmoticonModel] {
        if let recentEmoticons = NSKeyedUnarchiver.unarchiveObject(withFile: recentEmoticonPath) as? [HMEmoticonModel] {
            return recentEmoticons
        } else {
            // 沙盒中没有加载到模型
            return [HMEmoticonModel]()
        }
    }
}
